#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 柔性数组 ：结构体中的最后一个元素允许是未知大小的数组。
// 结构体中的柔性数组成员前面必须至少一个其他成员
// sizeof返回的结构体大小，不包含柔性数组的内存

// 包含柔性数组成员的结构体用malloc()函数进行内存的动态分配;
// 并且分配的内存应该大于结构的大小，以适应柔性数组的预期大小

struct s_a {
    int ai;
    int aa[]; // 柔性数组成员
};
struct s_b {
    int bi;
    int ba[0]; // 柔性数组成员
};
int main()
{   
    printf("s_a = %d \n", sizeof(struct s_a));  // 输出4
    printf("s_b = %d \n", sizeof(struct s_b));  // 输出4

    struct s_a sa;
    struct s_b sb;
    printf("sa = %d \n", sizeof(sa)); // 输出4
    printf("sb = %d \n", sizeof(sb)); // 输出4
    
    struct s_a *sc = malloc(sizeof(struct s_a) + 4 * sizeof(int));
    
    sc->ai = 100;
    // 对数组0 - 3 赋值
    for(int i = 0;i < 4;i++){
        sc->aa[i] = i;
    }
    // 输出数组0 - 3 的值
    for(int i = 0;i < 4;i++){
        printf("%d\n ", sc->aa[i]); // 输出0 1 2 3
    }
    // realloc 这里如果觉得sc->aa的空间不足的话，可以重新调整内存
    int *ptr = realloc(sc->aa, 10 *sizeof(int));
    if(ptr != NULL){ //如果调整成功
        sc->aa = ptr;
    }
    // 对数组 4 - 10赋值
    for(int i=4;i<10;i++){
        sc->aa[i] = i;
    }
    // 输出数组 4 -10的值
    for (int i = 0; i < 10; i++)
    {
        printf("%d\n ", sc->aa[i]); // 输出4 5 6 7 8 9 
    }
    return 0; // 返回 0
}
